/**
 * 右键菜单定义
 */
define(function() {
	(function($) {
		var menu, shadow, trigger, content, hash, currentTarget;
		var defaults = {
			menuStyle : {
				
			},
			itemStyle : {
				
			},
			itemHoverStyle : {
				
			},
			eventPosX : 'pageX',
			eventPosY : 'pageY',
			shadow : true,
			onContextMenu : null,
			onShowMenu : null
		};

		$.fn.contextMenu = function(id, options) {
			if (!menu) { // Create singleton menu
				menu = $('<div id="jqContextMenu"></div>').hide().css({
					position : 'absolute',
					zIndex : '500'
				}).appendTo('body').bind('click', function(e) {
					e.stopPropagation();
				});
			}
			if (!shadow) {
				shadow = $('<div></div>').css({
					backgroundColor : '#000',
					position : 'absolute',
					opacity : 0.2,
					zIndex : 499
				}).appendTo('body').hide();
			}
			hash = hash || [];
			hash
					.push({
						id : id,
						menuStyle : $.extend({}, defaults.menuStyle,
								options.menuStyle || {}),
						itemStyle : $.extend({}, defaults.itemStyle,
								options.itemStyle || {}),
						itemHoverStyle : $.extend({}, defaults.itemHoverStyle,
								options.itemHoverStyle || {}),
						bindings : options.bindings || {},
						shadow : options.shadow || options.shadow === false ? options.shadow
								: defaults.shadow,
						onContextMenu : options.onContextMenu
								|| defaults.onContextMenu,
						onShowMenu : options.onShowMenu || defaults.onShowMenu,
						eventPosX : options.eventPosX || defaults.eventPosX,
						eventPosY : options.eventPosY || defaults.eventPosY
					});

			var index = hash.length - 1;
			$(this)
					.bind(
							'contextmenu',
							function(e) {
								//校验Menu是否存在
								var bShowContext = (!!hash[index].onContextMenu) ? hash[index]
										.onContextMenu(e)
										: true;
								if (bShowContext)
									display(index, this, e, options);
								return false;
							});
			return this;
		};

		function display(index, trigger, e, options) {
			var cur = hash[index];
			content = $('#' + cur.id).find('ul:first').clone(true);
			content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
					function() {
						$(this).css(cur.itemHoverStyle);
					}, function() {
						$(this).css(cur.itemStyle);
					}).find('img').css({
				verticalAlign : 'middle',
				paddingRight : '2px'
			});


			menu.html(content);

			if (!!cur.onShowMenu)
				menu = cur.onShowMenu(e, menu);

			$.each(cur.bindings, function(id, func) {
				$('#' + id, menu).bind('click', function(e) {
					hide();
					func(trigger, currentTarget, id);
				});
			});

			menu.css({
				'left' : e[cur.eventPosX],
				'top' : e[cur.eventPosY]
			}).show();
			if (cur.shadow)
				shadow.css({
					width : menu.width(),
					height : menu.height(),
					left : e.pageX + 2,
					top : e.pageY + 2
				}).show();
			$(document).one('click', hide);
		}

		function hide() {
			menu.hide();
			shadow.hide();
		}

		//默认初始化
		$.contextMenu = {
			defaults : function(userDefaults) {
				$.each(userDefaults, function(i, val) {
					if (typeof val == 'object' && defaults[i]) {
						$.extend(defaults[i], val);
					} else
						defaults[i] = val;
				});
			}
		};

	})(jQuery);
})